home *** CD-ROM | disk | FTP | other *** search
- /* ShowModule.e; dumps all the infos in a '.m' binary file */
-
- ENUM JOB_DONE,JOB_CONST,JOB_OBJ,JOB_LIB=6
- ENUM ER_NONE,ER_FILE,ER_MEM,ER_USAGE,ER_JOBID,ER_BREAK,ER_FILETYPE
-
- DEF flen,o:PTR TO INT,mem,handle=NIL
-
- PROC main() HANDLE
- WriteF('ShowModule v0.1 (c) 1992 $#%!\n')
- WriteF('now showing: "\s"\n',arg)
- WriteF('NOTE: don\at use this output in your code, use the module instead.\n\n')
- IF StrCmp(arg,'',1) OR StrCmp(arg,'?',2)
- Raise(ER_USAGE)
- ELSE
- flen:=FileLength(arg)
- handle:=Open(arg,OLDFILE)
- IF (flen<8) OR (handle=NIL)
- Raise(ER_FILE)
- ELSE
- mem:=New(flen)
- IF mem=NIL
- Raise(ER_MEM)
- ELSE
- IF Read(handle,mem,flen)<>flen THEN Raise(ER_FILE)
- Close(handle)
- handle:=NIL
- process()
- ENDIF
- ENDIF
- ENDIF
- EXCEPT
- IF handle THEN Close(handle)
- WriteF('\n')
- SELECT exception
- CASE ER_FILE; WriteF('Could not read file "\s" !\n',arg)
- CASE ER_MEM; WriteF('No memory for loading module!\n')
- CASE ER_USAGE; WriteF('USAGE: ShowModule <module>\n')
- CASE ER_JOBID; WriteF('Illegal job id!\n')
- CASE ER_BREAK; WriteF('User interupted ShowModule\n')
- CASE ER_FILETYPE; WriteF('Not an E module file.\n')
- ENDSELECT
- ENDPROC
-
- PROC process()
- DEF end,job,len,val,f,off,types:PTR TO LONG,c,r,c2
- o:=mem
- end:=o+flen
- types:=['substructure','CHAR','INT','','LONG']
- IF ^o++<>"EMOD" THEN Raise(ER_FILETYPE)
- WHILE o<end
- IF CtrlC() THEN Raise(ER_BREAK)
- job:=o[]++
- SELECT job
- CASE JOB_CONST
- len:=o[]++; f:=TRUE
- WHILE len
- val:=^o++
- IF f THEN WriteF('CONST ') ELSE WriteF(' ')
- WriteF('\s=',o)
- IF (val>=-$20) AND (val<$20) THEN WriteF('\d',val) ELSE WriteF('$\h',val)
- o:=o+len; len:=o[]++; f:=FALSE
- IF len THEN WriteF(',\n') ELSE WriteF('\n\n')
- IF CtrlC() THEN Raise(ER_BREAK)
- ENDWHILE
- CASE JOB_OBJ
- len:=o[]++;
- WriteF('(---) OBJECT \s\n',o+4)
- o:=o+4+len
- WHILE len:=o[]++
- val:=o[]++
- off:=o[]++
- WriteF('(\d[3]) \s:\s\n',off,o,types[val])
- o:=o+len
- IF CtrlC() THEN Raise(ER_BREAK)
- ENDWHILE
- val:=o[]++
- WriteF('(---) ENDOBJECT /* SIZEOF=')
- WriteF(IF val<>$FFFF THEN '\d */\n\n' ELSE 'NONE !!! */\n\n',val)
- CASE JOB_LIB
- c:=o
- WHILE c[]++ DO NOP
- WriteF('LIBRARY \a\s\a, \s /* informal notation */\n',o,c)
- WHILE c[]++ DO NOP
- WHILE (c[]<>$FF) AND (c<end)
- c2:=c
- WHILE c[]++>" " DO NOP; c--
- r:=c[]; c[]++:=0
- WriteF(' \s\c',c2,"(")
- WHILE r<" "
- IF r<16 THEN IF r<8 THEN WriteF('D\d',r) ELSE WriteF('A\d',r-8)
- r:=c[]++
- IF r<16 THEN WriteF(',')
- ENDWHILE
- c--
- WriteF(')\n')
- ENDWHILE
- WriteF('ENDLIBRARY\n\n')
- o:=end
- CASE JOB_DONE
- o:=end
- DEFAULT
- Raise(ER_JOBID)
- ENDSELECT
- ENDWHILE
- ENDPROC
-